iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
DevOps

大家都在用 Terraform 實作 IaC 為什麼不將程式寫得更簡潔易讀呢?系列 第 1

如何利用 HCL 語言的撰寫 Terraform 專案的基本介紹 (Part I) - 深入淺出 HCL

  • 分享至 

  • xImage
  •  

Terraform 是一個用於管理基礎設施代碼 (Infrastructure as Code,IaC) 的工具,它允許你通過定義和配置基礎設施來自動化資源的創建和管理。Terraform 使用的配置語言被稱為 HCL (HashiCorp Configuration Language),它是一種專為描述基礎設施的語言。

  1. 宣告性語言 (Declarative Language): HCL 是一種宣告性的語言,這意味著你描述你想要的狀態,而不是指定詳細的步驟。Terraform 將根據你的描述來決定如何創建和管理基礎設施。

  2. 資源塊 (Resource Blocks): 在 HCL 中,你使用資源塊來定義不同類型的基礎設施資源。每個資源塊描述了一個特定資源的屬性和配置。

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}
  1. 變數 (Variables): 你可以定義變數來儲存需要在多個地方重複使用的值。這讓你可以在需要時更輕鬆地修改配置。在你的 Terraform 配置中,你可以定義變數,指定它們的類型、描述和預設值 (預設值由需求決定)。
variable "instance_names" {
  description = "A map of instance names"
  type        = map(string)
  default = {
    "web"   = "t2.micro"
    "app"   = "t2.small"
    "db"    = "t2.medium"
  }
}

resource "aws_instance" "example" {
  for_each = var.instance_names

  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = each.value
  tags = {
    Name = each.key
  }
}
  1. 本地變數 (Locals):是用於在 Terraform 配置文件內部定義和使用的變數。它們通常用於在配置文件中暫存計算值,從而使配置更加可讀和模組化。本地變數僅在所定義的模塊、資源或區塊內部可見,不能從外部設置。
variable "instance_names" {
  description = "A map of instance names"
  type        = map(string)
  default = {
    "web"   = "t2.micro"
    "app"   = "t2.small"
    "db"    = "t2.medium"
  }
}

resource "aws_instance" "example" {
  for_each = var.instance_names

  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = each.value
  tags = {
    Name = each.key
  }
}
  1. 資料源 (Datasource):我們可以使用 Datasource 來根據指定的條件選擇符合要求的 AMI,範例如下:
data "aws_ami" "selected_ami" {
  most_recent = true

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-ebs"]
  }

  filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["amazon"
}
  1. 動態區塊 (Dynamic Block):使用 dynamic 語法可以使你根據可變數量的輸入動態地生成資源,這樣可以更靈活地管理和配置基礎設施。然而,需要注意的是,dynamic 語法和 for_each 在 Terraform 中是相對複雜的功能,可能需要一些實踐和理解,以確保正確地使用它們,範例如下:
resource "aws_route53_zone" "r53zone" {
  # checkov:skip=CKV2_AWS_38: Need to check DNSSEC later
  # checkov:skip=CKV2_AWS_39: We don't want to enable logging at this moment

  name = var.domain_name

  dynamic "vpc" {
    for_each = var.vpcs
    content {
      vpc_id     = vpc.value["vpc_id"]
      vpc_region = vpc.value["vpc_region"]
    }
  }

  tags = { for tag in var.tags : tag.key => tag.value }
}

接下來,下一篇將介紹 HCL 常用到的函式。


下一篇
如何利用 HCL 語言的撰寫 Terraform 專案的基本介紹 (Part II) - HCL 常用函式
系列文
大家都在用 Terraform 實作 IaC 為什麼不將程式寫得更簡潔易讀呢?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言